package com.example.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

/**
 * @author fyxw
 */
public class JwtUtils {
    private static final String SECURITY = "WONIUXY";
    private JwtUtils(){}
    /**
     * 这个验证方法是再生成一次秘钥，自动比较 当前token是不是之前生成的token
     * @param token  生成的JWT
     * @param username 账号
     * @return 是否验证成功
     */
    public static boolean verify(String token,String username){
        //这里需要加密算法来对我们的woniuxy进行加密
        Algorithm algorithm = Algorithm.HMAC256(SECURITY);
        //重新生成一个token
        JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username)
                .build();
        //比较两个token的内容
        verifier.verify(token);
        return true;
    }

    /**
     * 签名生成jwt
     * @param username 用户名
     * @return token
     */
    public static String sign(String username){
        //对唯一秘钥进行加密使用
        Algorithm algorithm = Algorithm.HMAC256(SECURITY);
        return JWT.create()
                .withClaim("username",username)
                .withClaim("creatTime",System.currentTimeMillis())
                //签名 如果签名不对，则无法解析jwt
                .sign(algorithm);
    }

    /**
     * 用来传入token返回一个该token的用户名
     * @param token 传入token字符串
     * @return username
     */
    public static String getUserName(String token){
        DecodedJWT jwt = JWT.decode(token);
        Claim username = jwt.getClaim("username");
        return username.asString();
    }
}